package com.appspot.eusms;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.actionbarsherlock.app.SherlockFragment;
import com.appspot.eusms.database.EncryptedBackupExporter;
import com.appspot.eusms.database.NoExternalStorageException;
import com.appspot.eusms.database.PlaintextBackupExporter;
import com.appspot.eusms.util.Dialogs;

import com.appspot.eusms.R;

import org.whispersystems.textsecure.crypto.MasterSecret;

import java.io.IOException;


public class ExportFragment extends SherlockFragment {

    private static final int SUCCESS = 0;
    private static final int NO_SD_CARD = 1;
    private static final int IO_ERROR = 2;

    private MasterSecret masterSecret;

    public void setMasterSecret(MasterSecret masterSecret) {
        this.masterSecret = masterSecret;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
        View layout = inflater.inflate(R.layout.export_fragment, container, false);
        View exportEncryptedView = layout.findViewById(R.id.export_encrypted_backup);
        View exportPlaintextView = layout.findViewById(R.id.export_plaintext_backup);

        exportEncryptedView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handleExportEncryptedBackup();
            }
        });

        exportPlaintextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handleExportPlaintextBackup();
            }
        });

        return layout;
    }

    private void handleExportEncryptedBackup() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setIcon(Dialogs.resolveIcon(getActivity(), R.attr.dialog_info_icon));
        builder.setTitle(getActivity().getString(R.string.ExportFragment_export_to_sd_card));
        builder.setMessage(getActivity().getString(R.string.ExportFragment_this_will_export_your_encrypted_keys_settings_and_messages));
        builder.setPositiveButton(getActivity().getString(R.string.ExportFragment_export), new Dialog.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                new ExportEncryptedTask().execute();
            }
        });
        builder.setNegativeButton(getActivity().getString(R.string.ExportFragment_cancel), null);
        builder.show();
    }

    private void handleExportPlaintextBackup() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setIcon(Dialogs.resolveIcon(getActivity(), R.attr.dialog_alert_icon));
        builder.setTitle(getActivity().getString(R.string.ExportFragment_export_plaintext_to_sd_card));
        builder.setMessage(getActivity().getString(R.string.ExportFragment_warning_this_will_export_the_plaintext_contents));
        builder.setPositiveButton(getActivity().getString(R.string.ExportFragment_export), new Dialog.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                new ExportPlaintextTask().execute();
            }
        });
        builder.setNegativeButton(getActivity().getString(R.string.ExportFragment_cancel), null);
        builder.show();
    }

    private class ExportPlaintextTask extends AsyncTask<Void, Void, Integer> {
        private ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            dialog = ProgressDialog.show(getActivity(),
                    getActivity().getString(R.string.ExportFragment_exporting),
                    getActivity().getString(R.string.ExportFragment_exporting_plaintext_to_sd_card),
                    true, false);
        }

        @Override
        protected Integer doInBackground(Void... params) {
            try {
                PlaintextBackupExporter.exportPlaintextToSd(getActivity(), masterSecret);
                return SUCCESS;
            } catch (NoExternalStorageException e) {
                Log.w("ExportFragment", e);
                return NO_SD_CARD;
            } catch (IOException e) {
                Log.w("ExportFragment", e);
                return IO_ERROR;
            }
        }

        @Override
        protected void onPostExecute(Integer result) {
            Context context = getActivity();

            if (dialog != null)
                dialog.dismiss();

            if (context == null)
                return;

            switch (result) {
                case NO_SD_CARD:
                    Toast.makeText(context,
                            context.getString(R.string.ExportFragment_error_unable_to_write_to_sd_card),
                            Toast.LENGTH_LONG).show();
                    break;
                case IO_ERROR:
                    Toast.makeText(context,
                            context.getString(R.string.ExportFragment_error_while_writing_to_sd_card),
                            Toast.LENGTH_LONG).show();
                    break;
                case SUCCESS:
                    Toast.makeText(context,
                            context.getString(R.string.ExportFragment_success),
                            Toast.LENGTH_LONG).show();
                    break;
            }
        }
    }

    private class ExportEncryptedTask extends AsyncTask<Void, Void, Integer> {
        private ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            dialog = ProgressDialog.show(getActivity(),
                    getActivity().getString(R.string.ExportFragment_exporting),
                    getActivity().getString(R.string.ExportFragment_exporting_keys_settings_and_messages),
                    true, false);
        }

        @Override
        protected void onPostExecute(Integer result) {
            Context context = getActivity();

            if (dialog != null) dialog.dismiss();

            if (context == null) return;

            switch (result) {
                case NO_SD_CARD:
                    Toast.makeText(context,
                            context.getString(R.string.ExportFragment_error_unable_to_write_to_sd_card),
                            Toast.LENGTH_LONG).show();
                    break;
                case IO_ERROR:
                    Toast.makeText(context,
                            context.getString(R.string.ExportFragment_error_while_writing_to_sd_card),
                            Toast.LENGTH_LONG).show();
                    break;
                case SUCCESS:
                    Toast.makeText(context,
                            context.getString(R.string.ExportFragment_success),
                            Toast.LENGTH_LONG).show();
                    break;
            }
        }

        @Override
        protected Integer doInBackground(Void... params) {
            try {
                EncryptedBackupExporter.exportToSd(getActivity());
                return SUCCESS;
            } catch (NoExternalStorageException e) {
                Log.w("ExportFragment", e);
                return NO_SD_CARD;
            } catch (IOException e) {
                Log.w("ExportFragment", e);
                return IO_ERROR;
            }
        }
    }
}